package tadp;

import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;

import org.junit.Before;
import org.junit.Test;

public class GuerrerosTestDriver {

	private Guerrero alejandroMagno;
	private Guerrero julioCesar;
	private Espadachin athos;
	private Misil unMisil;

	/*
	 * Vamos a comenzar pensando un juego de estrategia, similar al Age of
	 * Empires. En este juego existen guerreros que pueden atacarse entre sí.
	 * Cada Guerrero tiene un potencial ofensivo y un potencial defensivo y una
	 * cantidad de energia. Cuando un guerrero ataca a otro compara el potencial
	 * ofensivo suyo contra el potencial defensivo del otro. Si el potencial
	 * ofensivo del atacante es mayor o igual al del defensor, entonces el
	 * defensor resta la diferencia entre ambos en energia.
	 */

	@Before
	public void setup() {
		alejandroMagno = new Guerrero(30, 40);
		julioCesar = new Guerrero(50, 67);
		athos = new Espadachin(30, 40, new Espada(10), 0.3);
	}

	@Test
	public void elAtaqueHaceDañoSiSuperaLaDefensa() {
		julioCesar.atacar(alejandroMagno);
		assertEquals(90, alejandroMagno.getEnergia());
	}

	@Test
	public void resiste() throws Exception {
		assertTrue(alejandroMagno.resisteAtaque(40));
	}

	@Test
	public void elAtaqueNoHaceDañoSiNoSuperaLaDefensa() {
		alejandroMagno.atacar(julioCesar);
		assertEquals(100, julioCesar.getEnergia());
	}

	/*
	 * A agregamos un caso especial de Guerrero: los espadachines, que se
	 * parecen mucho a los guerreros, pero su potencial ofensivo se ve
	 * incrementado por el uso de una espada. Para modelar esto agreagamos dos
	 * clases Espadachin y Espada.
	 */

	@Test
	public void elAtaquieDeunEspadachinTieneBonusPorEspada() throws Exception {
		assertEquals(19, athos.getPotencialOfensivo());
	}

	/*
	 * luego agregamos Misiles, que pueden atacar pero no tiene sentido que se
	 * defiendan. 
	 * 
	 * Los misiles tienen un potencial ofensivo fijo de 1000, por lo tanto esa
	 * implementación no será compartida con los demás Atacantes. 
	 */
	
	@Test
	public void misilPuedeAtacarAUnGuerrero() throws Exception {
		unMisil  = new Misil();
		unMisil.atacar(athos);
		assertEquals(-860, athos.getEnergia()); 
		
	}
}
